package br.com.devteam.sgap.view.interno;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;

import br.com.devteam.base.util.Message;
import br.com.devteam.base.util.SGAPContantes;
import br.com.devteam.sgap.model.Tema;
import br.com.devteam.sgap.service.IService;

@Controller(value = "MBeanManterTema")
@Scope(value = "session")
public class MBeanManterTema {
	
	@Autowired
	private IService service;
	
	private Tema tema;
	private List<Tema> temas;
	
	private boolean cadastrando;
	private String busca;
	
	public MBeanManterTema() {
	}
	
	public String actionCarregarFiltro() {

		try {
			busca = new String();
			carregarTemas();
		} catch (Exception e) {
			e.printStackTrace();
			Message.e(SGAPContantes.MESSAGE_FIELD, SGAPContantes.ERROR_GENERIC);
			Message.manterMensagensRedirect();
		}

		return SGAPContantes.PAGE_FILTER_TEMAS;
	}
	
	public String actionPrepararCadastro() {
		tema = new Tema();
		busca = new String();

		cadastrando = true;
		
		return SGAPContantes.PAGE_REGISTER_TEMAS;
	}
	
	private void carregarTemas() throws Exception {
		temas = service.findByNamedQuery(Tema.QUERY_LIST_ASC_ORDER);
	}
	
	@Transactional
	public String actionSalvar() {

		if (validar()) {
			try {
				if (isCadastrando()) {
					service.save(tema);
					Message.i(SGAPContantes.MESSAGE_FIELD,
							SGAPContantes.ENTRY_SAVE);
					Message.manterMensagensRedirect();
				} else {
					service.update(tema);
					Message.i(SGAPContantes.MESSAGE_FIELD,
							SGAPContantes.ENTRY_UPDATE);
					Message.manterMensagensRedirect();
				}
				cadastrando = false;

				carregarTemas();

				return SGAPContantes.PAGE_FILTER_TEMAS;
			} catch (Exception e) {
				e.printStackTrace();
				Message.e(SGAPContantes.MESSAGE_FIELD,
						SGAPContantes.ERROR_GENERIC);
			}
		}
		busca = new String();
		return "";
	}
	
	@Transactional
	public String actionExcluir(Tema tema) {
		try {
			tema = service.findById(Tema.class, tema.getId());
			service.delete(tema);
			Message.i(SGAPContantes.MESSAGE_FIELD, SGAPContantes.ENTRY_DELETE);
			Message.manterMensagensRedirect();
			return actionCarregarFiltro();
		} catch (Exception e) {
			e.printStackTrace();
			Message.e(SGAPContantes.MESSAGE_FIELD,
					SGAPContantes.ERROR_NOT_DELETED);
		}

		return "";
	}
	
	public String actionEditar(Tema tema) {
		this.tema = tema;
		cadastrando = false;

		return SGAPContantes.PAGE_REGISTER_TEMAS;
	}
	
	public String actionPesquisar() throws Exception {
		if (busca == null || busca.isEmpty()) {
			carregarTemas();
		} else if (busca.length() < 2) {
			Message.e(SGAPContantes.MESSAGE_FIELD,
					SGAPContantes.ERROR_SHORT_SEARCH);
		} else {
			Map<String, Object> params = new HashMap<String, Object>();
			params.put("busca", "%" + busca + "%");

			temas = service.findByNamedQuery(Tema.QUERY_SEARCH, params);

			if (temas.size() == 0) {
				Message.e(SGAPContantes.MESSAGE_FIELD,
						SGAPContantes.ERROR_SEARCH_NO_DATA);
			}
		}
		return "";
	}
	
	public String actionCancelarCadastro() throws Exception {
		tema = new Tema();
		cadastrando = false;
		temas = new ArrayList<Tema>();
		carregarTemas();
		return "/pages/interno/temas/temas_filtro.xhtml?faces-redirect=true";//SGAPContantes.PAGE_FILTER_USUARIO;
	}
	
	private boolean validar() {
		boolean retorno = true;
		
		Map<String, Object> params = new HashMap<String, Object>();
		params.put("nome", tema.getNome());
		List<Tema> listTemas = service.findByNamedQuery(Tema.QUERY_NOME, params);

		if (!listTemas.isEmpty()) {
			if (tema.getNome().equals(listTemas.get(0).getNome())) {
				retorno = false;
				Message.e("nome", SGAPContantes.ERROR_FORM_FIELD_NOME_TEMA);
			}
		}

		if (tema.getNome() == null || tema.getNome().length() < 1) {
			retorno = false;
			Message.e("nome", SGAPContantes.ERROR_EMPTY_TEXT_FIELD);
		}
		
		return retorno;
	}
	public Tema getTema() {
		if (tema == null) {
			tema = new Tema();
		}
		return tema;
	}
	public void setTema(Tema tema) {
		this.tema = tema;
	}
	public List<Tema> getTemas() {
		if (temas == null) {
			temas = new ArrayList<Tema>();
		}
		return temas;
	}
	public void setTemas(List<Tema> temas) {
		this.temas = temas;
	}
	public boolean isCadastrando() {
		return cadastrando;
	}
	public void setCadastrando(boolean cadastrando) {
		this.cadastrando = cadastrando;
	}
	public String getBusca() {
		return busca;
	}
	public void setBusca(String busca) {
		this.busca = busca;
	}

}
